const { sequelize, testConnection } = require('../dao/dbConnect');
const MigrationManager = require('./migrate');
const SeederManager = require('./seed');

/**
 * 数据库完整设置脚本
 * 包含连接测试、迁移执行、种子数据插入
 */
class DatabaseSetup {
  constructor() {
    this.migrationManager = new MigrationManager();
    this.seederManager = new SeederManager();
  }

  /**
   * 检查数据库连接
   */
  async checkConnection() {
    console.log('🔌 检查数据库连接...');
    
    try {
      await testConnection();
      console.log('✅ 数据库连接正常');
      return true;
    } catch (error) {
      console.error('❌ 数据库连接失败:', error.message);
      console.error('');
      console.error('请检查以下配置:');
      console.error(`   数据库主机: ${process.env.DB_HOST || 'localhost'}`);
      console.error(`   数据库端口: ${process.env.DB_PORT || '3306'}`);
      console.error(`   数据库名称: ${process.env.DB_NAME || 'promote_putonghua'}`);
      console.error(`   数据库用户: ${process.env.DB_USER || 'root'}`);
      console.error('');
      console.error('确保MySQL服务正在运行，并且数据库已创建。');
      return false;
    }
  }

  /**
   * 检查数据库是否存在
   */
  async checkDatabase() {
    console.log('🗄️  检查数据库是否存在...');
    
    try {
      const dbName = process.env.DB_NAME || 'promote_putonghua';
      const [results] = await sequelize.query(
        `SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?`,
        { replacements: [dbName] }
      );

      if (results.length === 0) {
        console.log(`⚠️  数据库 '${dbName}' 不存在`);
        return false;
      }

      console.log(`✅ 数据库 '${dbName}' 存在`);
      return true;
    } catch (error) {
      console.error('❌ 检查数据库失败:', error.message);
      return false;
    }
  }

  /**
   * 创建数据库
   */
  async createDatabase() {
    console.log('🏗️  创建数据库...');
    
    try {
      const dbName = process.env.DB_NAME || 'promote_putonghua';
      
      // 创建临时连接（不指定数据库）
      const tempSequelize = new (require('sequelize').Sequelize)(
        '', // 不指定数据库
        process.env.DB_USER || 'root',
        process.env.DB_PASS || 'password',
        {
          host: process.env.DB_HOST || 'localhost',
          dialect: 'mysql',
          logging: false
        }
      );

      await tempSequelize.query(
        `CREATE DATABASE IF NOT EXISTS \`${dbName}\` 
         CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`
      );

      await tempSequelize.close();
      console.log(`✅ 数据库 '${dbName}' 创建成功`);
      return true;

    } catch (error) {
      console.error('❌ 创建数据库失败:', error.message);
      return false;
    }
  }

  /**
   * 完整设置流程
   */
  async setup(options = {}) {
    const {
      createDb = true,
      runMigrations = true,
      seedData = true,
      force = false
    } = options;

    console.log('🚀 开始数据库完整设置...');
    console.log('='.repeat(60));
    console.log(`配置信息:`);
    console.log(`   环境: ${process.env.NODE_ENV || 'development'}`);
    console.log(`   主机: ${process.env.DB_HOST || 'localhost'}`);
    console.log(`   端口: ${process.env.DB_PORT || '3306'}`);
    console.log(`   数据库: ${process.env.DB_NAME || 'promote_putonghua'}`);
    console.log(`   用户: ${process.env.DB_USER || 'root'}`);
    console.log('='.repeat(60));

    try {
      // 1. 检查基础连接（不指定数据库）
      if (createDb) {
        const dbExists = await this.checkDatabase();
        if (!dbExists) {
          const created = await this.createDatabase();
          if (!created) {
            throw new Error('数据库创建失败');
          }
        }
      }

      // 2. 检查数据库连接
      const connected = await this.checkConnection();
      if (!connected) {
        throw new Error('数据库连接失败');
      }

      // 3. 执行迁移
      if (runMigrations) {
        console.log('');
        await this.migrationManager.migrate();
      }

      // 4. 插入种子数据
      if (seedData) {
        console.log('');
        await this.seederManager.seed();
      }

      console.log('');
      console.log('='.repeat(60));
      console.log('🎉 数据库设置完成！');
      console.log('');
      console.log('📋 后续步骤:');
      console.log('   1. 启动应用: npm start');
      console.log('   2. 访问API文档: http://localhost:3000/api-docs');
      console.log('   3. 管理员登录: admin / password');
      console.log('');
      console.log('🔧 管理命令:');
      console.log('   查看迁移状态: npm run db:migrate:status');
      console.log('   重置数据库: npm run db:reset');
      console.log('   重新种子: npm run db:seed:refresh');

    } catch (error) {
      console.error('');
      console.error('💥 数据库设置失败:', error.message);
      console.error('');
      console.error('🔍 故障排除:');
      console.error('   1. 确保MySQL服务正在运行');
      console.error('   2. 检查.env文件中的数据库配置');
      console.error('   3. 确保数据库用户有足够的权限');
      console.error('   4. 检查防火墙设置');
      throw error;
    }
  }

  /**
   * 重置数据库
   */
  async reset() {
    console.log('🗑️  重置数据库...');
    console.log('⚠️  这将删除所有数据！');

    try {
      // 清空数据
      await this.seederManager.reset();
      
      // 重新执行迁移
      await this.migrationManager.migrate();
      
      // 重新插入种子数据
      await this.seederManager.seed();

      console.log('✅ 数据库重置完成');

    } catch (error) {
      console.error('❌ 数据库重置失败:', error.message);
      throw error;
    }
  }

  /**
   * 显示数据库状态
   */
  async status() {
    console.log('📊 数据库状态信息');
    console.log('='.repeat(50));

    try {
      await this.checkConnection();
      
      console.log('');
      await this.migrationManager.status();
      
      console.log('');
      console.log('📈 数据统计:');
      const { User, Course, CourseCategory, EvaluationRecord, GameRecord, DailyRecord } = require('../dao/model');
      
      console.log(`   用户数量: ${await User.count()}`);
      console.log(`   分类数量: ${await CourseCategory.count()}`);
      console.log(`   课程数量: ${await Course.count()}`);
      console.log(`   评测记录: ${await EvaluationRecord.count()}`);
      console.log(`   游戏记录: ${await GameRecord.count()}`);
      console.log(`   每日记录: ${await DailyRecord.count()}`);

    } catch (error) {
      console.error('❌ 获取状态失败:', error.message);
      throw error;
    }
  }
}

/**
 * 命令行处理
 */
async function main() {
  const setup = new DatabaseSetup();
  const command = process.argv[2] || 'setup';

  try {
    switch (command) {
      case 'setup':
        await setup.setup();
        break;
      
      case 'reset':
        await setup.reset();
        break;
      
      case 'status':
        await setup.status();
        break;
      
      case 'create-db':
        await setup.createDatabase();
        break;
      
      default:
        console.log('用法:');
        console.log('  node setup.js setup     # 完整数据库设置');
        console.log('  node setup.js reset     # 重置数据库');
        console.log('  node setup.js status    # 显示数据库状态');
        console.log('  node setup.js create-db # 仅创建数据库');
        process.exit(1);
    }

  } catch (error) {
    console.error('💥 操作失败:', error.message);
    process.exit(1);
  } finally {
    await sequelize.close();
    console.log('🔌 数据库连接已关闭');
  }
}

// 如果直接运行此脚本
if (require.main === module) {
  main();
}

module.exports = DatabaseSetup;
